import { RouteRecordRaw } from "vue-router";
import { defineStore } from "pinia";
import { constantRoutes } from "@/router";
import { store } from "@/store";
import { listRoutes } from "@/api/menu";

const modules = import.meta.glob("../../views/**/**.vue");
// 这行代码的作用是根据匹配规则动态获取指定目录下所有的.vue 模块，并返回一个对象，该对象包含了匹配到的模块路径和对应的加载函数。
const Layout = () => import("@/layout/index.vue");

import { data } from '../../../mock/router'

/**
 * Use meta.role to determine if the current user has permission
 * 使用meta.role确定当前用户是否具有权限
 * @param roles 用户角色集合
 * @param route 路由
 * @returns
 */

const hasPermission = (roles: string[], route: RouteRecordRaw) => {
  if (route.meta && route.meta.roles) {
    // 角色【超级管理员】拥有所有权限，忽略校验
    if (roles.includes("ROOT")) {
      return true;
    }
    return roles.some((role) => {
      if (route.meta?.roles !== undefined) {
        return (route.meta.roles as string[]).includes(role);
      }
    });
  }
  return false;
}


/**
 * 递归过滤有权限的异步(动态)路由
 *
 * @param routes 接口返回的异步(动态)路由
 * @param roles 用户角色集合
 * @returns 返回用户有权限的异步(动态)路由
 */
const filterAsyncRoutes = (routes: RouteRecordRaw[], roles: string[]) => {
  const asyncRoutes: RouteRecordRaw[] = [];

  routes.forEach((route) => {
    const tmpRoute = { ...route }; // ES6扩展运算符复制新对象
    if (!route.name) {
      tmpRoute.name = route.path;
    }
    // 判断用户(角色)是否有该路由的访问权限
    if (hasPermission(roles, tmpRoute)) {
      if (tmpRoute.component?.toString() == "Layout") {
        tmpRoute.component = Layout;
      } else {
        const component = modules[`../../views/${tmpRoute.component}.vue`];
        if (component) {
          tmpRoute.component = component;
        } else {
          tmpRoute.component = modules[`../../views/error-page/404.vue`];
        }
      }

      if (tmpRoute.children) {
        tmpRoute.children = filterAsyncRoutes(tmpRoute.children, roles);
      }

      asyncRoutes.push(tmpRoute);
    }
  });

  return asyncRoutes;
};

//setup 写法
export const usePermissionStore=defineStore('permission',()=>{
  // state
  const routes = ref<RouteRecordRaw[]>([]);

  //actions
  function setRoutes(newRoutes: RouteRecordRaw[]) {
    routes.value = constantRoutes.concat(newRoutes);
  }
  /**
 * 生成动态路由
 *
 * @param roles 用户角色集合
 * @returns
 */
  function generateRoutes(roles: string[]) {
    // <RouteRecordRaw[]>
    return new Promise((resolve,reject)=>{
      // 接口获取所有路由
      // listRoutes()
      // .then(({ data: asyncRoutes }) =>{
      // // 根据角色获取有访问权限的路由
      //   const accessedRoutes = filterAsyncRoutes(asyncRoutes, roles);
      //   setRoutes(accessedRoutes);
      //   resolve(accessedRoutes);
      // }).catch((error) => {
      //   reject(error);
      // });
      const accessedRoutes = filterAsyncRoutes(data.data, roles);
      setRoutes(accessedRoutes);
      resolve(accessedRoutes);
    })
  }

  /**
 * 混合模式左侧菜单
 */
  const mixLeftMenu = ref<RouteRecordRaw[]>([]);

  function getMixLeftMenu(activeTop: string) {
    routes.value.forEach((item) => {
      if (item.path === activeTop) {
        mixLeftMenu.value = item.children || [];
      }
    });
  }

  return{
    routes,
    setRoutes,
    generateRoutes,
    mixLeftMenu,
    getMixLeftMenu
  }
})

export function usePermissionStoreHook(){
  return usePermissionStore(store)
}